\subsection{Normalizar}
El objetivo de este algoritmo es  modificar cada pixel para ampliar el rango de valores de toda la imagen. Para esto utilizamos la f'ormula general (ecuaci'on \ref{eq:normalizar}), estableciendo los valores m'aximos y m'inimos posibles para el caso de las imagenes en escala de grises (255 y 0 respectivamente). Luego realizamos algunas operaciones 'algebraicas a fin de poder establecer una constante de multiplicaci'on que procesar'a cada pixel.

Entonces el algoritmo queda divido en tres partes: la primera busca el m'aximo y m'inimo de la imagen, la segunda calcula la constante $K$ mientras que la segunda procesa los valores aplicando la ecuaci'on ya descripta.

\begin{equation}
\begin{array}{rl}
I_{out}(i,j) &= (I_{in}(i,j) - max) \times \left( \dfrac{a-b}{max-min} \right) + a  \\
\\
I_{out}(i,j) &= (I_{in}(i,j) - max) \times \left( \dfrac{255-0}{max-min} \right) + 255  \\
\\
I_{out}(i,j) &= \dfrac{255 \times (I_{in}(i,j) - min)}{max-min}  $\hspace{10pt} \textit{\scriptsize factor comun (max - min)}$ \\
\\
$Sea $ K &\leftarrow \dfrac{255}{max-min}  \\
\\
I_{out}(i,j) &= K \times (I_{in}(i,j) - min) \\
\\ \\
$Ecuaci'on \theequation:$&$Desarrollo de la f'ormula de normalizado$
\end{array} 
\label{eq:normalizar}
\end{equation}


\subsubsection*{B'usqueda de m'aximo y m'inimo}

Para encontrar los valores m'aximos y m'inimos nos valemos de las instrucciones \textit{pmaxub} y \textit{pminub}. Las mismas comparan los valores byte a byte quedandose con los correspondientes a cada funci'on. Entonces, despues de recorrer la matriz obtenemos dos registros, uno con los candidatos a m'aximo y otro con los candidatos a m'inimo (paso 0). 

Lo que queda por hacer entonces es comparar los bytes dentro de cada registro para identificar al mayor y menor. Para ello duplicamos el registro y realizamos sucesivos intercambios para comparar todos con todos. Iniciamos invirtiendo la parte alta por la parte baja de registro y volviendo a utilizar las instruciones de m'aximo y m'inimo para comparar (paso 1). Entonces ahora tenemos ocho candidatos en la parte alta del registro. Repetimos el proceso utilizando intercambiando los dos double-words mas significativos (paso 2). Ahora tenemos cuatro candidatos, una vez mas repetimos la operacion intercambiando ahora los words mas significativos (paso 3).

En este punto tenemos dos candidatos en el word mas significativo del registro. Para compararlos, duplicamos el registro y hacemos un desplazamiento a izquierda de un byte (paso 4). De esta manera, al comparar queda en el byte mas significativo el valor buscado. 

Una vez obtenidos estos dos valores, hacemos un desplazamiento a izquierda de tres bytes, y en el \textit{double word} mas significativo nos queda el valor deseado. Ahora hacemos un \textit{broadcast} a todos los \textit{double word} y el registro nos queda con los valores deseados empaquetados a \textit{double word}.

La Figura \ref{est:normalizar-1} muestra como se van reduciendo los candidatos aplicando las operaciones antes descriptas.

\begin{figure}[ht]
\xmmW{paso 0.}{cc & cc & cc & cc & cc & cc & cc & cc}
\xmmW{paso 1.}{cc & cc & cc & cc & xx & xx & xx & xx}
\xmmW{paso 2.}{cc & cc & xx & xx & xx & xx & xx & xx}
\xmmW{paso 3.}{cc & xx & xx & xx & xx & xx & xx & xx}
\xmmW{paso 4.}{mx & xx & xx & xx & xx & xx & xx & xx}
\xmmD{paso 5.}{00 0m & 00 0m & 00 0m & 00 0m}
\caption{\textit{busqueda de m'aximo y m'inimo}}
\label{est:normalizar-1}
\end{figure}


\subsubsection*{C'alculo de la constante $K$}

Para calcular la constante $K$ a partir de el valor m'aximo y m'inimo obtenidos en el paso anterior, es importante tener en cuenta que dicho valor es un n'umero decimal. Es por esto que para no perder realizamos las cuentas utilizando como tipo de dato empaquetado al decimal con punto flotante de precisi'on simple. Entonces lo primero que realizamos fue una conversion de los registros que contenian el m'aximo y m'inimo empaquetados en \textit{double words} a un formato empaquetado \textit{float single presicion}, luego, realizando las operaciones descriptas en la ecuaci'on \ref{eq:normalizar} obtenemos un registro con la constante empaquetada como \textit{float}. Lo mismo hacemos con el registro que contiene el m'inimo, pues lo necesitamos en los c'alculos.


\subsubsection*{Procesamiento de los p'ixeles}

En esta etapa recorremos la matriz de a 16 p'ixeles, la desempaquetamos a \textit{words} separando y parte alta y baja. Cada parte es a su vez desempaquetada a  \textit{double words} y convertida a empaquetados de punto flotante. Entonces, por cada lectura nos quedan cuatro registros con cada uno cuatro valores listos para ser procesados sin perder precisi'on. A los mismos se les resta el valor m'inimo con la resta de punto flotante (\textit{subps}) y se multiplica por la constante $K$ (\textit{mulps}).

Una vez calculado cada p'ixel se realiza el camino inverso al descripto empaquetando el resultado. Primero se convierte el resultado de empaquetado de punto flotante a \textit{double word}, luego a \textit{word} y por 'ultimo a byte. Es importante resaltar que los empaquetamientos que realizamos son con saturaci'on signada. Es decir que si el valor esta fuera del rango permitido se satura al m'aximo o al m'inimo seg'un corresponda. 

Una vez que el resultado es empaquetado, 'este se baja a memoria y se continua con la siguiente iteraci'on.


